<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
</body>
<script>
    //递归  （1.找规律   2.找出口）
            //n! = n * (n-1)!
        function fn(n){
            if(n === 1 || n === 0){
                return 1;
            }
            return n * fn(n-1);
        }
       console.log(fn(5));

    //1.求出1+1+2+3+5+......得值
       //fb(n) = fb(n-1)+fn(n-2)
      function fb(n){
          if(n === 1 || n === 2){
              return 1;
          }
          return fb(n - 1) + fb(n - 2);
      }
      console.log(fb(5));


      //闭包会导致多个执行函数共用一个公有变量，如果不是特殊需要，应尽量防止这种情况发生


     //立即执行函数定义:此函数没有声明，在一次执行过后就被释放。适合做初始化工作

     //js为单线程，解释语言



     //js三部曲
        //1.
       //2.预编译（1.函数声明整体提升   2.变量声明提升，
       // 3.如果变量未经声明就赋值，那么此变量就为全局对象所有。
       // 4.一切声明的全局变量，全是window的属性）
              // window(全局对象)（window就是去全局）


      //预编译发生在函数执行的前一刻

         //预编译(
    //          1.创建AO对象（执行期上下文）
     //            2.找形参和变量申明，将变量和形参名作为AO属性名，值为undefined
    //            3.将实参值和形参统一
    //          4.在函数体里面找函数声明，值赋予函数体
    // )

    function fn(a){
        console.log(a);//function a(){}
                                                      /* Ao{
                                                              a:undefined  1 function a(){} 123
                                                              b:undefined   function (){}
                                                              d: function d(){}
                                                       }*/


        var a = 123;
        console.log(a);
        function a(){}
        console.log(a);
        var b = function (){};
        console.log(b);
        function d(){}
    }
    fn(1);


    //1.生成一个GO对象


      /*****
       * GO{
       *      test:undefined   function test(){}
       * }
       * *****/
        console.log(test);   //function test(){}
        console.log(test);
        function test(test){
            console.log(test);    //function test(){}
            var test = 234;
            console.log(test);      //234
            function test(){}
        }
        /*****
         * AO{
         *        test : undefined  1  function test(){}
         *
         * }
         * ****/
        test(1);
        var test = 123;


        /*****
         * GO{
         *          global : undefined  100;
         *
         * }
         * ****/
      global = 100;
      function fn() {
          console.log(global);
          global = 200;
          console.log(global);
          var global = 300;
      }

     /* AO{

         global : undefined 200;

    }*/
        fn();
      var global;



   /* GO{
        a:undefined   10
        c:234

    }*/
      function test (){
          console.log(b);   //undefined
          if(a) {
              var b = 100;
          }
          console.log(b);    //undefined
          c = 234;
          console.log(c);  //234
      }
      var a;
    /*  AO{
          b:undefined
    }*/
      test();
      a = 10;
      console.log(c);     //234



     /******百度笔试题1.2********/
     //1.
    function bar() {
        return foo;
        foo = 10;
        function foo(){}
        var foo = 11;
     }

    console.log(bar());



    //2.
    console.log(bar());
    function bar() {
        foo = 10;
        function foo() {

        }
        var foo = 11;
        return foo;
    }


    //3.
   /* GO{
        a:100
        demo:function(){}
        f:123
    }*/
    a = 100;
    function demo(e) {
        function e() {}
        arguments[0] = 2;
        console.log(e);  //2
        if(a) {
            var b = 123;
            function c() {

            }
        }
        var c;
        a = 10;
        var a;
        console.log(b);  //undefined
        f = 123; //暗示全局变量
        console.log(c);   //undefined,(function c(){})
        console.log(a);   //10
    }
    var a;
   /* AO{
        e:undefined   1   function e() {}  2
        b:undefined
        c:undefined   function c() {}
        a:undefined   10

    }*/
    demo(1);
    console.log(a);  //100
    console.log(f);   //123


    /*********/
    var str = false + 1;
    console.log(str);
    var demo = false === 1;
    console.log(demo);
    if(typeof (a) && -true + (+undefined) + ""){
        console.log("能打印吗？");
    }
    if(11 + "11" * 2 === 33){
        console.log("hello");
    }
    !!" " + !!"" - !!false || console.log("hello,world!!!");


    /*********/
    var x = 1;
    if(function f() {}){
        x += typeof(f);
    }

    console.log(x);   //1undefined
    /*******/
    var x = 1;
    function f() {};
    if(function f() {}){
        x += typeof(f);
    }

    console.log(x);   //1function
</script>
</html>